{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Freeform Optimization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "from optiland import optic, optimization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define a starting lens:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We define a singlet lens, which has a freeform as its first surface.\n",
    "\n",
    "The freeform surface is defined as:\n",
    "\n",
    "$z(x, y) = \\frac{r^2}{R \\cdot (1 + \\sqrt{(1 - (1 + k) \\cdot r^2 / R^2)})} + \\sum\\limits_{i}\\sum\\limits_{j}{C_{i, j} \\cdot x^i \\cdot y^j}$\n",
    "\n",
    "where $x$ and $y$ are the local surface coordinates, $r^2 = x^2 + y^2$, $R$ is the radius of curvature, $k$ is the conic constant and $C_{i, j}$ is the polynomial coefficient for indices $i, j$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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3erVq3X11Vfrve99r84//3zdd9996u3t1bXXXtvooWEEOHz4sHbu3Fk8fv3117V161ZNnDhRs2bN0he/+EX98z//s04++WTNnTtXt9xyi6ZPn64rrriicYNGQ61cuVLr16/XE088oZaWluI6kLa2NiUSCbW1tem6667T6tWrNXHiRLW2tur666/X4sWLdcEFFzR49GiENWvW6EMf+pBmzZqlnp4erV+/Xs8884x+/etf834ZbRrdFg9jz9VXX+1J6vf129/+tnjNrl27vA996ENeIpHwJk+e7N14442e4ziNGzQa6v777/dmzZrlRaNR7/zzz/eee+65Rg8JI8Rvf/tb398nV199ted5uZbdt9xyizd16lQvFot5F198sbdjx47GDhoN5fd+keStW7eueE1fX5/3D//wD96ECRO8pqYm72Mf+5i3f//+xg0aDfXpT3/amz17theNRr329nbv4osv9v77v/+7+Dzvl9HD8DzPG/44BgAAAAAjB2uMAAAAAIx5BCMAAAAAYx7BCAAAAMCYRzACAAAAMOYRjAAAAACMeQQjAAAAAGMewQgAAADAmEcwAgAAADDmEYwAAAAAjHkEIwAAAABjHsEIAAAAwJhHMAIAAAAw5v3/t38sbgqmssQAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens = optic.Optic()\n",
    "\n",
    "# add surfaces\n",
    "lens.add_surface(index=0, thickness=np.inf)\n",
    "lens.add_surface(\n",
    "    index=1,\n",
    "    radius=100,\n",
    "    thickness=5,\n",
    "    surface_type=\"polynomial\",\n",
    "    is_stop=True,\n",
    "    material=\"SF11\",\n",
    "    coefficients=[],\n",
    ")\n",
    "lens.add_surface(index=2, thickness=30, radius=-1000)\n",
    "lens.add_surface(index=3)\n",
    "\n",
    "# set aperture\n",
    "lens.set_aperture(aperture_type=\"EPD\", value=15)\n",
    "\n",
    "# add field\n",
    "lens.set_field_type(field_type=\"angle\")\n",
    "lens.add_field(y=0)\n",
    "\n",
    "# add wavelength\n",
    "lens.add_wavelength(value=0.55, is_primary=True)\n",
    "\n",
    "# draw lens\n",
    "lens.draw(num_rays=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define optimization problem:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "problem = optimization.OptimizationProblem()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Add operands (targets for optimization). We will minimize the RMS spot size on-axis and force the on-axis field chief ray to intersect the image plane at y = 3 mm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# RMS spot size operand\n",
    "input_data = {\n",
    "    \"optic\": lens,\n",
    "    \"surface_number\": -1,\n",
    "    \"Hx\": 0,\n",
    "    \"Hy\": 0,\n",
    "    \"wavelength\": 0.55,\n",
    "    \"num_rays\": 5,\n",
    "}\n",
    "problem.add_operand(\n",
    "    operand_type=\"rms_spot_size\",\n",
    "    target=0,\n",
    "    weight=1,\n",
    "    input_data=input_data,\n",
    ")\n",
    "\n",
    "# Real y-intercept operand\n",
    "input_data = {\n",
    "    \"optic\": lens,\n",
    "    \"surface_number\": -1,\n",
    "    \"Hx\": 0,\n",
    "    \"Hy\": 0,\n",
    "    \"Px\": 0,\n",
    "    \"Py\": 0,\n",
    "    \"wavelength\": 0.55,\n",
    "}\n",
    "problem.add_operand(\n",
    "    operand_type=\"real_y_intercept\",\n",
    "    target=3,\n",
    "    weight=1,  # <-- target=3\n",
    "    input_data=input_data,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define variables - let the first 9 coefficients of the polynomial coefficients vary."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(3):\n",
    "    for j in range(3):\n",
    "        problem.add_variable(\n",
    "            lens,\n",
    "            \"polynomial_coeff\",\n",
    "            surface_number=1,\n",
    "            coeff_index=(i, j),\n",
    "        )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Check initial merit function value and system properties:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "╒════╤════════════════════════╤═══════════════════╕\n",
      "│    │   Merit Function Value │   Improvement (%) │\n",
      "╞════╪════════════════════════╪═══════════════════╡\n",
      "│  0 │                26.1803 │                 0 │\n",
      "╘════╧════════════════════════╧═══════════════════╛\n",
      "╒════╤══════════════════╤══════════╤══════════╤═════════╤══════════╤════════════════════╕\n",
      "│    │ Operand Type     │   Target │   Weight │   Value │    Delta │   Contribution (%) │\n",
      "╞════╪══════════════════╪══════════╪══════════╪═════════╪══════════╪════════════════════╡\n",
      "│  0 │ rms spot size    │        0 │        1 │ 4.14491 │  4.14491 │             65.623 │\n",
      "│  1 │ real y intercept │        3 │        1 │ 0       │ -3       │             34.377 │\n",
      "╘════╧══════════════════╧══════════╧══════════╧═════════╧══════════╧════════════════════╛\n",
      "╒════╤══════════════════╤═══════════╤═════════╤══════════════╤══════════════╕\n",
      "│    │ Variable Type    │   Surface │   Value │ Min. Bound   │ Max. Bound   │\n",
      "╞════╪══════════════════╪═══════════╪═════════╪══════════════╪══════════════╡\n",
      "│  0 │ polynomial_coeff │         1 │       0 │              │              │\n",
      "│  1 │ polynomial_coeff │         1 │       0 │              │              │\n",
      "│  2 │ polynomial_coeff │         1 │       0 │              │              │\n",
      "│  3 │ polynomial_coeff │         1 │       0 │              │              │\n",
      "│  4 │ polynomial_coeff │         1 │       0 │              │              │\n",
      "│  5 │ polynomial_coeff │         1 │       0 │              │              │\n",
      "│  6 │ polynomial_coeff │         1 │       0 │              │              │\n",
      "│  7 │ polynomial_coeff │         1 │       0 │              │              │\n",
      "│  8 │ polynomial_coeff │         1 │       0 │              │              │\n",
      "╘════╧══════════════════╧═══════════╧═════════╧══════════════╧══════════════╛\n"
     ]
    }
   ],
   "source": [
    "problem.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define optimizer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimizer = optimization.OptimizerGeneric(problem)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run optimization:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  message: CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH\n",
       "  success: True\n",
       "   status: 0\n",
       "      fun: 0.0007136726720011206\n",
       "        x: [-4.565e-06 -1.158e-01  1.400e-02 -7.709e-09  1.591e-07\n",
       "            -7.314e-09  1.394e-02 -1.418e-05  9.539e-07]\n",
       "      nit: 16\n",
       "      jac: [-5.123e-06  1.932e-04 -6.649e-04  9.056e-06  7.249e-03\n",
       "            -2.941e-03 -1.224e-04  1.634e-03  1.562e-04]\n",
       "     nfev: 370\n",
       "     njev: 37\n",
       " hess_inv: <9x9 LbfgsInvHessProduct with dtype=float64>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimizer.optimize(tol=1e-9)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Print merit function value and system properties after optimization:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "╒════╤════════════════════════╤═══════════════════╕\n",
      "│    │   Merit Function Value │   Improvement (%) │\n",
      "╞════╪════════════════════════╪═══════════════════╡\n",
      "│  0 │            0.000713673 │           99.9973 │\n",
      "╘════╧════════════════════════╧═══════════════════╛\n",
      "╒════╤══════════════════╤══════════╤══════════╤══════════╤══════════════╤════════════════════╕\n",
      "│    │ Operand Type     │   Target │   Weight │    Value │        Delta │   Contribution (%) │\n",
      "╞════╪══════════════════╪══════════╪══════════╪══════════╪══════════════╪════════════════════╡\n",
      "│  0 │ rms spot size    │        0 │        1 │ 0.026714 │  0.026714    │        99.9949     │\n",
      "│  1 │ real y intercept │        3 │        1 │ 2.99981  │ -0.000190397 │         0.00507948 │\n",
      "╘════╧══════════════════╧══════════╧══════════╧══════════╧══════════════╧════════════════════╛\n",
      "╒════╤══════════════════╤═══════════╤══════════════╤══════════════╤══════════════╕\n",
      "│    │ Variable Type    │   Surface │        Value │ Min. Bound   │ Max. Bound   │\n",
      "╞════╪══════════════════╪═══════════╪══════════════╪══════════════╪══════════════╡\n",
      "│  0 │ polynomial_coeff │         1 │ -4.56505e-06 │              │              │\n",
      "│  1 │ polynomial_coeff │         1 │ -0.115752    │              │              │\n",
      "│  2 │ polynomial_coeff │         1 │  0.0140048   │              │              │\n",
      "│  3 │ polynomial_coeff │         1 │ -7.70891e-09 │              │              │\n",
      "│  4 │ polynomial_coeff │         1 │  1.5914e-07  │              │              │\n",
      "│  5 │ polynomial_coeff │         1 │ -7.31429e-09 │              │              │\n",
      "│  6 │ polynomial_coeff │         1 │  0.0139404   │              │              │\n",
      "│  7 │ polynomial_coeff │         1 │ -1.41761e-05 │              │              │\n",
      "│  8 │ polynomial_coeff │         1 │  9.63853e-07 │              │              │\n",
      "╘════╧══════════════════╧═══════════╧══════════════╧══════════════╧══════════════╛\n"
     ]
    }
   ],
   "source": [
    "problem.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Draw final lens:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0YAAAEUCAYAAAAP/SbNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABeFklEQVR4nO3deXjb5Zkv/O9P+y5Lsizb8hLHSbzFZgkkJCwhBOIA7ZQph9NDT8vSlva0gWkJ7VvoQDvATFPaTpfT6SnTd1o4c3UYWuYtdJmZmBAgDCVsgTSJnTh7HNuxvGu19t/7hxZL3mInlrV9P9eVy5b0k30HFNtfP89z34IoiiKIiIiIiIiKmCTbBRAREREREWUbgxERERERERU9BiMiIiIiIip6DEZERERERFT0GIyIiIiIiKjoMRgREREREVHRYzAiIiIiIqKix2BERERERERFT5btAhZbNBpFf38/9Ho9BEHIdjlERERERJQloijC7XajsrISEsnca0IFF4z6+/tRXV2d7TKIiIiIiChHnD17FlVVVXNeU3DBSK/XAwBOnDyVfJ+IiIiIiIqP2+1G/fK6eeWCggtGie1zer0eBoMhy9UQEREREVG2zeeIDZsvEBERERFR0WMwIiIiIiKiosdgRERERERERS+jwWjZsmUQBGHan23bts14/bPPPjvtWpVKlckSiYiIiIiIMtt84b333kMkEknePnToEG666Sbccccdsz7HYDCgu7s7eZuziIiIiIiIKNMyGoysVmva7e985zuor6/Hxo0bZ32OIAgoLy/PZFlERERERERplqxddzAYxK9+9Sts3759zlUgj8eD2tpaRKNRXH755fj2t7+NlpaWWa8PBAIIBALJ2y6Xa1HrvhgjngD2nhzNdhlEBaevrw8amQC9UgK9QgK9UgKNXICkGFeYBWDlylWQy+XZroSIiCivLVkweumllzA+Po577rln1msaGhrwy1/+Em1tbXA6nfj+97+PDRs2oLOzc9ZJtTt27MDjjz+eoaovzokhLx76t4PZLoOoKAgQoUAYKiEMpRCGEmGohEjyfWX8flXK+0pEIBXEbJd+0dauW4cbbtic7TKIiIjymiCK4pL8VNDe3g6FQoE//OEP835OKBRCU1MT7rzzTjz55JMzXjPTilF1dTUGh4azPuA1EhURDEezWgNRoek524Pf/PrXuHbz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KaFRSLPxVyIiIqJ5WpIzRr///e8xMjKCe++997zX/su//At+9atfoby8HB/96Efx2GOPcdWIiJZM2yWX4q233kLX8dMQSipTzgHFzgR5gpPngOrMKqwqVaF9lRF1JiXqLCqY1Dy6SURElI+W5Dv4L37xC7S3t6OqqmrO6z75yU+itrYWlZWVOHDgAL7+9a+ju7sbv/3tb2d9TiAQQCAQSN52uVyLVvfFevfUKO75v/uyXQYRLZAYXYPoGyEAZyBARIngR4lkAg2SCZgUEzBJJqATghA8ADzARA/QhdifJa9VFLFsWV0WPjMREVFhWVAwevjhh/HUU0/Nec3hw4fTOjr19vaio6MDv/nNb8778T//+c8n329tbUVFRQU2b96MEydOoL6+fsbn7NixA48//vg8/wZLq9aiwTdvXfq2v0R0cdxuN4JeJ6oNUlTopJBJcvcckAABTc3N2S6DiIgo7wmiKIrzvXhoaAgjIyNzXrN8+XIoFIrk7SeffBI/+clP0NfXN22//vl4vV7odDrs3LkT7e3tM14z04pRdXU1BoeGYTAYFvT5iIiIiIiocLhcLpRZS+F0Os+bDRa0YmS1WmG1Wud9vSiKeOaZZ3DXXXctOBQBwP79+wEAFRUVs16jVCpzako9ERERERHlH0kmP/irr76KU6dO4XOf+9y0x/r6+tDY2Ih3330XAHDixAk8+eST2LdvH06fPo3f//73uOuuu3Ddddehra0tk2USEREREVGRy2jzhV/84hfYsGHDjFPkQ6EQuru74fP5AMRafL/yyiv40Y9+BK/Xi+rqatx+++149NFHM1kiERERERHRws4Y5QOXywWj0cgzRkRERERERW4hZ4wyupWOiIiIiIgoHzAYERERERFR0WMwIiIiIiKiopfR5gvZkDgy5Xa7s1wJERERERFlUyITzKetQsEFo8Rfvn55XZYrISIiIiKiXOB2u2E0Gue8puC60kWjUfT390Ov10MQhGyXQ7NwuVyorq7G2bNn2T2Q5oWvGVoovmZoofiaoYXiayb3iaIIt9uNyspKSCRznyIquBUjiUSCqqqqbJdB82QwGPiFhBaErxlaKL5maKH4mqGF4msmt51vpSiBzReIiIiIiKjoMRgREREREVHRYzCirFAqlfjWt74FpVKZ7VIoT/A1QwvF1wwtFF8ztFB8zRSWgmu+QERERERE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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens.draw(num_rays=5)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
